package org.windey.client;

import java.io.*;
import java.nio.channels.*;

/**
 * deze klasse dient om ervoor te zorgen dat de applicatie slechts 1 keer kan worden geopend
 */
public class ControleerBestaan {

	/**
	 * we houden de naam van de applicatie bij
	 */
    private String appName;
    /**
     * we maken file aan wanneer het programma is geopend
     */
    private File file;
    private FileChannel channel;
    private FileLock lock;

    /**
     * 
     * @param appName de naam van de applicatie
     */
    public ControleerBestaan(String appName) {
        this.appName = appName;
    }

    /**
     * methode om te controleren of een applicatie actief is 
     * @return true: applicatie is geopend, false: applicatie is niet geopend
     */
    public boolean isAppActive() {
        try {
            file = new File
                 (System.getProperty("user.home")+"/Windey Desktop Control", appName + ".tmp");
            channel = new RandomAccessFile(file, "rw").getChannel();

            try {
                lock = channel.tryLock();
            }
            catch (OverlappingFileLockException e) {
                // already locked
                closeLock();
                return true;
            }

            if (lock == null) {
                closeLock();
                return true;
            }

            Runtime.getRuntime().addShutdownHook(new Thread() {
                    // destroy the lock when the JVM is closing
                    public void run() {
                        closeLock();
                        deleteFile();
                    }
                });
            return false;
        }
        catch (Exception e) {
            closeLock();
            return true;
        }
    }

    private void closeLock() {
        try { 
        	lock.release();  
        }
        catch (Exception e) { 
        	
        }
        try { 
        	channel.close(); 
        }
        catch (Exception e) { 
        	
        }
    }

    private void deleteFile() {
        try { 
        	file.delete();
        }
        catch (Exception e) {
     
        }
    }
}